package main

import "fmt"

type SystemOne struct {
}

func (k SystemOne) Place() {
	fmt.Println("下单")
}

type SystemTwo struct {
}

func (k SystemTwo) Pay() {
	fmt.Println("支付")
}

type SystemThree struct {
}

func (k SystemThree) Deduct() {
	fmt.Println("扣库存")
}

type SystemFour struct {
}

func (k SystemFour) SendOut() {
	fmt.Println("发货")
}

type Order struct {
	StepOne   *SystemOne
	StepTwo   *SystemTwo
	StepThree *SystemThree
	StepFour  *SystemFour
}

func NewOrder() *Order {
	return &Order{
		StepOne:   &SystemOne{},
		StepTwo:   &SystemTwo{},
		StepThree: &SystemThree{},
		StepFour:  &SystemFour{},
	}
}

// HandleOrder
//
//	@Description: 处理订单
//	@receiver o
func (o Order) HandleOrder() {
	o.StepOne.Place()
	o.StepTwo.Pay()
	o.StepThree.Deduct()
	o.StepFour.SendOut()
}

// main
//
//	@Description: 它提供了一个统一的接口，用于访问子系统中的一组接口。外观模式的核心思想是简化复杂系统的使用，通过提供一个高层接口，隐藏系统的复杂性，使客户端更容易使用。
func main() {
	o := NewOrder()
	o.HandleOrder()
}
